/**
 * Created with IntelliJ IDEA.
 * Description:线程中断
 * interrupt的两种处理方式:1.运行状态,设置标志位; 2.阻塞状态,标志位设置了又被删除,触发异常
 * java里对异常中断的三种处理方式:
 * 1.立即处理;
 * 2.稍后处理
 * 3.不予理会
 * User: lenovo
 * Date: 2022-09-05
 * Time: 22:33
 */
public class Demo10 {
    /**
     * 方式3:添加sleep稍后处理
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            while(!Thread.currentThread().isInterrupted()){//Thread.currentThread()返回值为线程对象；isInterrupted()返回false
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // e.printStackTrace();
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                    break;
                }

            }
            System.out.println("t线程执行完成");
        });
        t.start();
        Thread.sleep(3000);
        t.interrupt();//将标志位设置为true.如果是t线程处于阻塞状态.不会设置标志位,而是提前触发InterruptedException异常
        System.out.println("设置t线程结束");

    }


    /**
     * 方式2:break理解处理
     * @param args
     * @throws InterruptedException
     */
//对于第1种情况的处理: 在interrupt触发异常后,trycatch捕捉到异常后,手动添加break,使线程的循环结束
    public static void main3(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            while(!Thread.currentThread().isInterrupted()){//Thread.currentThread()返回值为线程对象；isInterrupted()返回false
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                   // e.printStackTrace();
                    break;
                }

            }
            System.out.println("t线程执行完成");
        });
        t.start();
        Thread.sleep(3000);
        t.interrupt();//将标志位设置为true.如果是t线程处于阻塞状态.不会设置标志位,而是提前触发InterruptedException异常
        System.out.println("设置t线程结束");

    }

    //2.interrupt在线程运行状态,会将标志位设置为true
    public static void main2(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            while(!Thread.currentThread().isInterrupted()){//Thread.currentThread()返回值为线程对象；isInterrupted()返回false
                System.out.println("hello thread");
//                    //方式1:立即处理
//                    //break;
//                    //break;//方式2:不予理会,线程继续执行
//                    //方式3:线程稍后处理
//                    try {
//                        Thread.sleep(1000);
//                        //break;
//                    } catch (InterruptedException ex) {
//                        ex.printStackTrace();
//                    }
//                }
            }
            System.out.println("t线程执行完成");
        });
        t.start();
        Thread.sleep(1000);
        t.interrupt();//将标志位设置为true.如果是t线程处于阻塞状态.不会设置标志位,而是提前触发InterruptedException异常
        System.out.println("设置t线程结束");

    }

    /**
     * 方式1:不予理会
     * @param args
     * @throws InterruptedException
     */
    //1.interrupt 在线程阻塞阻塞状态时,不会设置标志位为true 而是触发InterruptedException异常,记录日志 提前唤醒sleep状态,线程会继续执行
    public static void main1(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            while(!Thread.currentThread().isInterrupted()){//Thread.currentThread()返回值为线程对象；isInterrupted()返回false
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
//                    //方式1:立即处理
//                    //break;
//                    //break;//方式2:不予理会,线程继续执行
//                    //方式3:线程稍后处理
//                    try {
//                        Thread.sleep(1000);
//                        //break;
//                    } catch (InterruptedException ex) {
//                        ex.printStackTrace();
//                    }
//                }
            }
            System.out.println("t线程执行完成");
        });
        t.start();
        Thread.sleep(3000);
        t.interrupt();//将标志位设置为true.如果是t线程处于阻塞状态.不会设置标志位,而是提前触发InterruptedException异常
        System.out.println("设置t线程结束");

    }
}
